const fs = require("fs");
const pathBase = require("path");
let path = ""; // JSON 文件的路径
let path2 = ""; // JSON 文件的路径

// 读取并解析 JSON 文件
const readJsonFile = (filePath) => {
  const fileContent = fs.readFileSync(filePath, "utf-8");
  return JSON.parse(fileContent);
};

// 写入修改后的 JSON 数据到文件
const writeJsonFile = (filePath, data) => {
  const jsonData = JSON.stringify(data); // 第二个参数使得输出格式化
  fs.writeFileSync(filePath, jsonData, "utf-8");
};

// 修改指定字段
const modifyJsonField = (filePath, newData) => {
  // 直接将修改后的对象写回文件
  writeJsonFile(filePath, newData);
};

// 查找指定文件的函数
function findFileInDir(dirPath, fileName) {
  let results = [];

  // 获取指定目录的文件和子目录
  const files = fs.readdirSync(dirPath);

  files.forEach((file) => {
    const fullPath = pathBase.join(dirPath, file);
    const stats = fs.statSync(fullPath);

    // 如果是文件夹，递归查找
    if (stats.isDirectory()) {
      results = results.concat(findFileInDir(fullPath, fileName));
    } else {
      // 如果是文件，检查文件名是否匹配
      if (file.includes(fileName)) {
        results.push(fullPath); // 找到的文件路径
      }
    }
  });

  return results;
}

// 删除文件夹及其中的所有内容
function deleteDir(dirPath) {
  const files = fs.readdirSync(dirPath);
  files.forEach((file) => {
    const fullPath = pathBase.join(dirPath, file);
    const stats = fs.statSync(fullPath);

    if (stats.isDirectory()) {
      // 如果是文件夹，递归删除
      deleteDir(fullPath);
    } else {
      // 如果是文件，删除文件
      fs.unlinkSync(fullPath);
    }
  });

  // 删除空文件夹
  fs.rmdirSync(dirPath);
}

// 复制文件夹及其内容
function copyDir(src, dest) {
  // 创建目标文件夹
  if (!fs.existsSync(dest)) {
    fs.mkdirSync(dest);
  }

  // 获取源目录中的文件和子目录
  const files = fs.readdirSync(src);

  files.forEach((file) => {
    const srcPath = pathBase.join(src, file);
    const destPath = pathBase.join(dest, file);
    const stats = fs.statSync(srcPath);

    if (stats.isDirectory()) {
      // 如果是文件夹，递归拷贝
      copyDir(srcPath, destPath);
    } else {
      // 如果是文件，直接拷贝
      fs.copyFileSync(srcPath, destPath);
    }
  });
}

// 主函数：拷贝文件夹
function copyFolder(srcDir, destDir) {
  if (fs.existsSync(destDir)) {
    // 如果目标文件夹存在，先删除
    deleteDir(destDir);
  }

  // 拷贝源文件夹到目标位置
  copyDir(srcDir, destDir);
  console.log(`文件夹拷贝完成：${srcDir} -> ${destDir}`);
}
// 使用示例===================================================================================

//修改游戏===
// 使用示例
const base_bundle = []; //["internal", "main"];
const game_list = ["ZeusKing", "zeusfunfastchristmas"]; //"base_game"
game_list.unshift(...base_bundle);
let assets = `D:\\dage\\本地服务\\game`; // 我的游戏文件夹
path = `E:\\dage\\hotupdatatest\\hotupdatatest\\king\\uat\\id2king`; // 目标游戏文件夹
path = `E:\\dage\\hotupdatatest\\id2king`;
//===================================================================================
let setting = "";
const settings = findFileInDir(path, "settings");
if (settings.length > 0) {
  setting = settings[0];
  console.log(`目标路径：${setting}`);
} else {
  console.log("没有找到settings.json");
  return;
}
const reslut_md5 = [];
game_list.forEach(function (game) {
  let asset = assets;
  asset = pathBase.join(asset, "assets");
  asset = pathBase.join(asset, game);

  const foundFiles = findFileInDir(asset, "config");
  if (foundFiles.length > 0) {
    const file = foundFiles[0];
    const list = file.split("\\");
    const last_md5 = list[list.length - 1].split(".")[1];
    reslut_md5.push({ game: game, md5: last_md5 });
    console.log(`修改成功：${last_md5}`, file);
    let jsonData = readJsonFile(file);
    // 在内存中修改目标字段
    if (base_bundle.includes(game)) {
      jsonData.deps = []; // 直接修改对象字段
    } else {
      jsonData.deps = ["main"]; // 直接修改对象字段
    }
    // 将修改后的对象保存回文件
    modifyJsonField(file, jsonData);
  }
  const targetAsset = pathBase.join(path, "assets", game);
  console.log(`拷贝${asset}--目标路径：${targetAsset}`);
  copyFolder(asset, targetAsset);
});
console.log("游戏完成========文件已更新========", setting);
//修改md5
let jsonData2 = readJsonFile(setting);
reslut_md5.forEach(function (game, index) {
  // 在内存中修改目标字段
  const old = jsonData2.assets.bundleVers[game.game];
  jsonData2.assets.bundleVers[game.game] = game.md5; // 直接修改对象字段
  // 将修改后的对象保存回文件
  modifyJsonField(setting, jsonData2);
  console.log(`修改成功： 旧的${old}-->新的${game.md5}---${game_list[index]}`);
});
console.log("JSON 文件已更新", setting);
//---
